package common

import (
	"fmt"
	"gitee.com/go_library/common/log"
	"github.com/labstack/echo"
	"strings"
)

/**
 * 设定调用时返回的错误类型
 */
type Error struct {
	Message string // 消息
	Code    int    // 错误码
}

func (e *Error) Error() string {
	return e.Message
}

// 调用错误，只展示给用户不需要进行调试
func NewCalledError(msg string, code ...int) *Error {
	err := &Error{
		Message: msg,
		Code:append(code, 0)[0],
	}
	return err
}

// 内部错误，将报错信息保存在日志中并将消息发送给用户
func NewInternalError(err error, msg ...string) *Error {
	o := ""
	if len(msg) > 0 {
		o = strings.Join(msg, "\r\n") + "\r\n"
	}
	o += err.Error()
	if err := log.Err.Output(2, o); err != nil {
		panic(err)
	}
	return &Error{
		Message: MsgInternalCallFailed,
	}
}

// 处理宕机
func NewSeriousError(info interface{}) *Error {
	if err := log.Err.Output(2, fmt.Sprintln(info)); err != nil {
		panic(err)
	}
	return &Error{
		Message: MsgInternalCallFailed,
	}
}

func NewBindDataError() *Error {
	return NewCalledError(MsgBindDataFailed)
}

func NewMissingParamError() *Error {
	return NewCalledError(MsgMissingParameter)
}

// 用来处理路由中返回的各种类型的错误
func HandleError(err error) *Result {
	var e *Error
	switch _err := err.(type) {
	case *Error:
		e = _err
	case *echo.HTTPError:
		e = NewInternalError(err)
	default:
		e = NewInternalError(err)
	}
	return &Result{
		Status:  false,
		Code:    e.Code,
		Massage: e.Message,
	}
}
